#include <iostream>

// 使用deprecated属性标记函数
[[deprecated("请使用new_function替代")]]
void old_function() {
    std::cout << "  这是一个过时的函数\n";
}

void new_function() {
    std::cout << "  这是一个新函数\n";
}

// 标记有deprecate属性的类
class [[deprecated("这个类已过时，请使用ModernClass")]] OldClass {
public:
    void method() {
        std::cout << "  OldClass中的方法\n";
    }
};

class ModernClass {
public:
    void method() {
        std::cout << "  ModernClass中的方法\n";
    }
};

// 标记过时的枚举值
// 注意：C++14不支持在枚举值上使用deprecated属性，这是C++17的特性
// 在C++14中，我们只能标记整个枚举或使用注释
enum Status {
    ACTIVE,
    PENDING,
    DELETED,  // [[deprecated]] - C++14不支持枚举值的deprecated属性
    INACTIVE
};

// 标记过时的模板特化
template<typename T>
class Container {
public:
    Container() { std::cout << "  通用容器创建\n"; }
};

// 注意：C++14中模板特化的deprecated属性语法不同
template<>
class [[deprecated("char特化已弃用")]] Container<char> {
public:
    Container() { std::cout << "  char特化容器创建\n"; }
};

void demonstrate_deprecated_attribute() {
    std::cout << "  调用标记为弃用的函数和类 (会产生编译警告):\n";
    
    // 调用过时函数（会生成警告）
    old_function();
    
    // 使用新函数
    new_function();
    
    // 使用过时类（会生成警告）
    OldClass old_obj;
    old_obj.method();
    
    // 使用新类
    ModernClass modern_obj;
    modern_obj.method();
    
    // 使用过时的枚举值（C++14中不会生成警告，只能通过注释说明）
    Status s = DELETED;  // 注意：DELETED已被弃用，请使用INACTIVE
    (void)s;  // 避免未使用变量警告
    
    // 创建过时的模板特化（会生成警告）
    Container<char> c_char;
    Container<int> c_int;
    
    std::cout << "\n  注意: 使用deprecated标记的元素会在编译时产生警告\n";
} 